package cn.sccl.test;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import cn.sccl.domain.Customer;
import cn.sccl.utils.HibernateUtils;

/**
 * @author 饶爽
 * @time 2019年8月25日 下午9:32:33
 * @version 1.0.0
 * 测试hibernate里对象的三种状态的类
*/
public class StateDemo {
    @Test
    //查看三种状态
    public void fun1() {
        //1.获得session
        Session session = HibernateUtils.openSession();
        //2.控制事务
        Transaction transaction = session.beginTransaction();
        //3.执行操作
        Customer customer = new Customer();// 没有id, 没有与session关联 => 瞬时状态
        
        customer.setCust_name("华为");// 瞬时状态
        
        session.save(customer);// 持久化状态, 有id,有关联
        //4.提交事务,关闭资源
        transaction.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联
    }
    
    @Test
    //三种状态特点
    //save方法: 其实不能理解成保存.理解成将瞬时状态转换成持久状态的方法
    //主键自增 : 执行save方法时,为了将对象转换为持久化状态.必须生成id值.所以需要执行insert语句生成.
    //increment: 执行save方法,为了生成id.会执行查询id最大值的sql语句.
    public void fun2(){
        //1 获得session
        Session session = HibernateUtils.openSession();
        //2 控制事务
        Transaction tx = session.beginTransaction();
        //3执行操作
        Customer c = new Customer(); // 没有id, 没有与session关联 => 瞬时状态
        
        c.setCust_name("联想"); // 瞬时状态
        
        session.save(c); // 持久化状态, 有id,有关联
        
        //4提交事务.关闭资源
        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联
    }
    
    @Test
    //三种状态特点
    // 持久化状态特点: 持久化状态对象的任何变化都会自动同步到数据库中.
    public void fun3(){
        //1 获得session
        Session session = HibernateUtils.openSession();
        //2 控制事务
        Transaction tx = session.beginTransaction();
        //3执行操作
        Customer c = session.get(Customer.class, 1l);//持久化状态对象
        
        c.setCust_name("微软公司");
        
        //4提交事务.关闭资源
        tx.commit();
        session.close();// 游离|托管 状态, 有id , 没有关联
    }
}
